package com.ssy.lingxi.order.service.base;

import com.ssy.lingxi.common.response.PageData;
import com.ssy.lingxi.common.response.Wrapper;
import com.ssy.lingxi.order.entity.OrderDO;
import com.ssy.lingxi.order.model.bo.OrderIdBO;
import com.ssy.lingxi.order.model.constant.OrderMemberTypeEnum;
import com.ssy.lingxi.order.model.constant.OrderOperationEnum;
import com.ssy.lingxi.order.model.vo.basic.response.OrderInnerHistoryVO;
import com.ssy.lingxi.order.model.vo.basic.response.OrderOuterHistoryVO;
import com.ssy.lingxi.order.model.vo.common.request.OrderProductHistoryVO;
import com.ssy.lingxi.order.model.vo.common.response.OrderProductHistoryQueryVO;

import java.util.List;

/**
 * 订单内、外流转记录接口
 * @author 万宁
 * @version 2.0.0
 * @date 2021-07-19
 */
public interface IBaseOrderHistoryService {
    /**
     * 保存采购商订单内部流转记录
     * @param memberId 登录用户会员Id
     * @param roleId    登录用户会员角色Id
     * @param userName 登录用户姓名
     * @param organizationName 登录用户组织机构名称
     * @param jobTitle 登录用户职位
     * @param orderId 订单Id
     * @param orderNo 订单编号
     * @param operation  操作类型枚举
     * @param buyerInnerStatus 采购商内部状态
     * @param remark    备注
     */
    void saveBuyerInnerHistory(Long memberId, Long roleId, String userName, String organizationName, String jobTitle, Long orderId, String orderNo, OrderOperationEnum operation, Integer buyerInnerStatus, String remark);

    /**
     * （批量）保存采购商订单内部流转记录
     * @param memberId 登录用户会员Id
     * @param roleId    登录用户会员角色Id
     * @param userName 登录用户姓名
     * @param organizationName 登录用户组织机构名称
     * @param jobTitle 登录用户职位
     * @param orderIds 订单Id与编号列表
     * @param operation  操作类型枚举
     * @param buyerInnerStatus 采购商内部状态枚举值
     * @param remark    备注
     */
    void saveBuyerInnerHistory(Long memberId, Long roleId, String userName, String organizationName, String jobTitle, List<OrderIdBO> orderIds, OrderOperationEnum operation, Integer buyerInnerStatus, String remark);

    /**
     * 保存供应商订单内部流转记录
     * @param memberId 登录用户会员Id
     * @param roleId    登录用户会员角色Id
     * @param userName 登录用户姓名
     * @param organizationName 登录用户组织机构名称
     * @param jobTitle 登录用户职位
     * @param orderId 订单Id
     * @param orderNo 订单编号
     * @param operation  操作类型枚举
     * @param vendorInnerStatus 供应商内部状态
     * @param remark    备注
     */
    void saveVendorInnerHistory(Long memberId, Long roleId, String userName, String organizationName, String jobTitle, Long orderId, String orderNo, OrderOperationEnum operation, Integer vendorInnerStatus, String remark);

    /**
     * （批量）保存订单内部流转记录
     * @param memberId 登录用户会员Id
     * @param roleId    登录用户会员角色Id
     * @param userName 登录用户姓名
     * @param organizationName 登录用户组织机构名称
     * @param jobTitle 登录用户职位
     * @param orderIds 订单Id与编号列表
     * @param memberType 订单会员类型
     * @param operation  操作类型枚举
     * @param statusCode 采购商或供应商内部状态枚举值
     * @param statusName 采购商或供应商内部状态名称
     * @param remark    备注
     */
    void saveOrderInnerHistory(Long memberId, Long roleId, String userName, String organizationName, String jobTitle, List<OrderIdBO> orderIds, OrderMemberTypeEnum memberType, OrderOperationEnum operation, Integer statusCode, String statusName, String remark);

    /**
     * 查询采购订单内部流转记录
     * @param order 订单
     * @return 内部流转记录
     */
    List<OrderInnerHistoryVO> listBuyerOrderInnerHistories(OrderDO order);

    /**
     * 查询采购订单内部流转记录
     * @param buyerMemberId 采购会员Id
     * @param buyerRoleId   采购会员角色Id
     * @param orderId 订单Id
     * @return 内部流转记录
     */
    List<OrderInnerHistoryVO> listBuyerOrderInnerHistories(Long buyerMemberId, Long buyerRoleId, Long orderId);

    /**
     * 查询供应订单内部流转记录
     * @param order 订单
     * @return 内部流转记录
     */
    List<OrderInnerHistoryVO> listVendorOrderInnerHistories(OrderDO order);

    /**
     * 查询供应订单内部流转记录
     * @param vendorMemberId 供应会员Id
     * @param vendorRoleId   供应会员角色Id
     * @param orderId 订单Id
     * @return 内部流转记录
     */
    List<OrderInnerHistoryVO> listVendorOrderInnerHistories(Long vendorMemberId, Long vendorRoleId, Long orderId);

    /**
     * 查询订单内部流转记录
     * @param memberId 采购会员或供应会员Id
     * @param roleId   采购会员或供应会员角色Id
     * @param orderId 订单Id
     * @return 内部流转记录
     */
    List<OrderInnerHistoryVO> listOrderInnerHistories(Long memberId, Long roleId, Long orderId);

    /**
     * 保存来自采购商的订单外部记录
     * @param orderId 订单Id
     * @param orderNo 订单编号
     * @param buyerMemberId 采购会员Id
     * @param buyerRoleId   采购会员角色
     * @param operatorMemberName 指定的操作会员名称
     * @param operatorRoleName   指定的操作会员角色名称
     * @param operationEnum      操作方法枚举
     * @param outerStatus        订单外部状态
     * @param statusName         订单外部状态名称
     * @param remark             备注
     */
    void saveBuyerOrderOuterHistory(Long orderId, String orderNo, Long buyerMemberId, Long buyerRoleId, String operatorMemberName, String operatorRoleName, OrderOperationEnum operationEnum, Integer outerStatus, String statusName, String remark);

    /**
     * （批量）保存来自采购商的订单外部记录
     * @param orderIds 订单Id与编号列表
     * @param buyerMemberId 采购会员Id
     * @param buyerRoleId   采购会员角色
     * @param operatorMemberName 指定的操作会员名称
     * @param operatorRoleName   指定的操作会员角色名称
     * @param operationEnum      操作枚举
     * @param outerStatus        订单外部状态
     * @param statusName         订单外部状态名称
     * @param remark             备注
     */
    void saveBuyerOrderOuterHistory(List<OrderIdBO> orderIds, Long buyerMemberId, Long buyerRoleId, String operatorMemberName, String operatorRoleName, OrderOperationEnum operationEnum, Integer outerStatus, String statusName, String remark);

    /**
     * 保存来自供应商的订单外部记录
     * @param orderId            订单Id
     * @param orderNo            订单编号
     * @param vendorMemberId     供应会员Id
     * @param vendorRoleId       供应会员角色Id
     * @param operatorMemberName 操作会员名称
     * @param operatorRoleName   指定的操作会员角色名称
     * @param operationEnum      操作枚举
     * @param outerStatus        订单外部状态
     * @param statusName         订单外部状态名称
     * @param remark             备注
     */
    void saveVendorOrderOuterHistory(Long orderId, String orderNo, Long vendorMemberId, Long vendorRoleId, String operatorMemberName, String operatorRoleName, OrderOperationEnum operationEnum, Integer outerStatus, String statusName, String remark);

    /**
     * 查询订单外部流转记录
     * @param order 订单
     * @return 外部流转记录
     */
    List<OrderOuterHistoryVO> listOrderOuterHistories(OrderDO order);

    /**
     * 查询订单外部流转记录
     * @param orderId 订单Id
     * @return 外部流转记录
     */
    List<OrderOuterHistoryVO> listOrderOuterHistories(Long orderId);

    /**
     * 记录订单商品交易记录
     * @param order 订单
     */
    void saveOrderProductHistory(OrderDO order);

    /**
     * 分页查询商品交易记录
     * @param historyVO 接口参数
     * @return 查询结果
     */
    Wrapper<PageData<OrderProductHistoryQueryVO>> pageOrderProductHistories(OrderProductHistoryVO historyVO);
}
